সি পয়েন্টার (C Pointer)

Computer Programming - সি প্রোগ্রামিং (C Programming)
563
563

পয়েন্টার হল একটি ভেরিয়েবল যার মান কোনো অন্য ভেরিয়েবলের মেমরি ঠিকানা। সি প্রোগ্রামিং ভাষায় পয়েন্টার একটি গুরুত্বপূর্ণ কনসেপ্ট, যা মেমরি ম্যানেজমেন্ট এবং ডেটা অ্যাক্সেস করার জন্য ব্যবহৃত হয়। পয়েন্টারের মাধ্যমে আপনি এক্সটারনাল ডেটা স্ট্রাকচার অ্যাক্সেস করতে পারেন এবং মেমরি ব্লক নিয়ন্ত্রণ করতে পারেন, যা সি প্রোগ্রামিংয়ের অন্যতম শক্তি।

পয়েন্টারের মৌলিক ধারণা:

  1. পয়েন্টার ভেরিয়েবল: একটি পয়েন্টার ভেরিয়েবল কোনো সাধারণ ভেরিয়েবলের মেমরি ঠিকানা ধারণ করে।
  2. এড্রেস অপারেটর (&): & অপারেটর ব্যবহার করে কোনো ভেরিয়েবলের মেমরি ঠিকানা পাওয়া যায়।
  3. ডেরিফারেন্স অপারেটর (*): * অপারেটর পয়েন্টারের মাধ্যমে মূল ভেরিয়েবলের মান অ্যাক্সেস করতে ব্যবহৃত হয়।

সি পয়েন্টারের সিঙ্ক্রোনাইজেশন

  • পয়েন্টার ডিক্লেয়ারেশন: পয়েন্টার ডিক্লেয়ার করতে হয় * চিহ্নের সাহায্যে, যেখানে * চিহ্ন জানিয়ে দেয় যে এটি একটি পয়েন্টার ভেরিয়েবল।

পয়েন্টার সি প্রোগ্রামিং এ

১. পয়েন্টারের ডিক্লেয়ারেশন এবং ব্যবহার

#include <stdio.h>

int main() {
    int num = 10;
    int *ptr; // Pointer declaration

    ptr = # // Pointer points to the address of num

    printf("Value of num: %d\n", num); // Direct access to the value
    printf("Address of num: %p\n", &num); // Address of num
    printf("Pointer ptr points to address: %p\n", ptr); // Pointer holds the address of num
    printf("Value pointed to by ptr: %d\n", *ptr); // Dereferencing the pointer to access value

    return 0;
}

ব্যাখ্যা:

  • int *ptr;: এটি একটি পয়েন্টার ভেরিয়েবল ptr ডিক্লেয়ার করেছে যা int টাইপের ভেরিয়েবলের মেমরি ঠিকানা ধারণ করবে।
  • ptr = #: এখানে ptr পয়েন্টারটি num ভেরিয়েবলের মেমরি ঠিকানা ধারণ করছে।
  • *ptr: এটি ptr পয়েন্টারের মাধ্যমে num এর মান অ্যাক্সেস করবে। এটি ডেরিফারেন্স অপারেটর।

আউটপুট:

Value of num: 10
Address of num: 0x7ffd9b4e2f8c
Pointer ptr points to address: 0x7ffd9b4e2f8c
Value pointed to by ptr: 10

২. পয়েন্টার অ্যারেগুলির সাথে ব্যবহার

#include <stdio.h>

int main() {
    int arr[] = {10, 20, 30, 40, 50};
    int *ptr;

    ptr = arr; // Pointer points to the first element of the array

    // Accessing array elements using pointer
    for (int i = 0; i < 5; i++) {
        printf("Element %d: %d\n", i, *(ptr + i)); // Dereferencing the pointer
    }

    return 0;
}

ব্যাখ্যা:

  • ptr = arr;: এখানে ptr পয়েন্টারটি অ্যারের প্রথম উপাদানকে পয়েন্ট করছে।
  • *(ptr + i): পয়েন্টারকে অ্যারের প্রতিটি উপাদানে ইনডেক্স করে অ্যাক্সেস করা হচ্ছে। এটি পয়েন্টারের মাধ্যমে অ্যারে উপাদান অ্যাক্সেস করতে সহায়তা করে।

আউটপুট:

Element 0: 10
Element 1: 20
Element 2: 30
Element 3: 40
Element 4: 50

৩. পয়েন্টার দিয়ে ফাংশনে মান প্রেরণ

#include <stdio.h>

// Function to swap values using pointers
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 5, y = 10;

    printf("Before swapping: x = %d, y = %d\n", x, y);

    // Calling swap function with pointers
    swap(&x, &y);

    printf("After swapping: x = %d, y = %d\n", x, y);

    return 0;
}

ব্যাখ্যা:

  • swap ফাংশনে int *a এবং int *b পয়েন্টার ব্যবহার করা হয়েছে।
  • &x এবং &y দ্বারা মান পাস করা হচ্ছে যাতে মূল ভেরিয়েবলগুলির মান সরাসরি পরিবর্তন করা যায়।
  • ফাংশনে পয়েন্টারের মাধ্যমে x এবং y এর মান একে অপরের সাথে পরিবর্তিত হয়।

আউটপুট:

Before swapping: x = 5, y = 10
After swapping: x = 10, y = 5

৪. ডায়নামিক মেমরি অ্যাক্সেস (Dynamic Memory Allocation)

সি প্রোগ্রামে ডায়নামিক মেমরি ব্যবহারের জন্য malloc(), calloc(), realloc(), এবং free() ফাংশন ব্যবহৃত হয়।

ডায়নামিক মেমরি এক্সাম্পল:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr;
    int n = 5;

    // Dynamically allocate memory for 5 integers
    ptr = (int*)malloc(n * sizeof(int));

    // Check if memory is allocated
    if (ptr == NULL) {
        printf("Memory allocation failed!\n");
        return 1;
    }

    // Assign values to dynamically allocated memory
    for (int i = 0; i < n; i++) {
        ptr[i] = (i + 1) * 10;
    }

    // Print the values
    for (int i = 0; i < n; i++) {
        printf("Element %d: %d\n", i, ptr[i]);
    }

    // Free dynamically allocated memory
    free(ptr);

    return 0;
}

ব্যাখ্যা:

  • malloc(n * sizeof(int)): এটি n সংখ্যক int ভেরিয়েবল জন্য মেমরি অ্যাক্সেস দেয়।
  • free(ptr): ডায়নামিক মেমরি মুক্ত করার জন্য ব্যবহৃত হয়।

আউটপুট:

Element 0: 10
Element 1: 20
Element 2: 30
Element 3: 40
Element 4: 50

সি পয়েন্টার সম্পর্কিত গুরুত্বপূর্ণ পয়েন্ট

  1. পয়েন্টার ডিক্লেয়ারেশন:
    • int *ptr;: এটি একটি পয়েন্টার ডিক্লেয়ারেশন যা int টাইপের মানের মেমরি ঠিকানা ধারণ করবে।
  2. এড্রেস অপারেটর (&):
    • &num: এটি num ভেরিয়েবলের মেমরি ঠিকানা প্রদান করে।
  3. ডেরিফারেন্স অপারেটর (*):
    • *ptr: এটি পয়েন্টার ptr এর মাধ্যমে মেমরি ঠিকানায় সংরক্ষিত ভেরিয়েবলের মান অ্যাক্সেস করে।
  4. পয়েন্টার অ্যারেগুলির সাথে:
    • পয়েন্টার ব্যবহার করে অ্যারের সকল উপাদান অ্যাক্সেস করা সম্ভব।
  5. ফাংশনে পয়েন্টার পাসিং:
    • পয়েন্টার ব্যবহারের মাধ্যমে ফাংশনে আর্গুমেন্ট পাস করতে পারেন যা মূল ভেরিয়েবলের মান পরিবর্তন করতে সাহায্য করে।

সারসংক্ষেপ

সি পয়েন্টার একটি শক্তিশালী এবং মৌলিক কনসেপ্ট যা মেমরি অ্যাক্সেস এবং ম্যানেজমেন্টে ব্যবহৃত হয়। এটি একাধিক ভেরিয়েবলকে একত্রিত করতে, ডায়নামিক মেমরি ব্যবস্থাপনা করতে এবং এক্সটারনাল ডেটা স্ট্রাকচার অ্যাক্সেস করতে সহায়তা করে। সঠিকভাবে পয়েন্টার ব্যবহার করলে, আপনি দ্রুত এবং কার্যকরী প্রোগ্রাম তৈরি করতে পারেন, তবে পয়েন্টার ব্যবহারে সঠিক মনোযোগ এবং সাবধানতা প্রয়োজন।

common.content_added_by

সি পয়েন্টার পরিচিত (C pointer introduction)

371
371

এই অধ্যায়ে আপনি সি প্রোগ্রামিং পয়েন্টার সম্মন্ধে জানবেন; পয়েন্টার কি, পয়েন্টার কিভাবে ব্যবহার করবেন এবং পয়েন্টার নিয়ে কাজ করার সময় সাধারণ ভুলের জন্য যে সকল সমস্যার সম্মুখীন হবেন।


 

সি প্রোগ্রামিং পয়েন্টার

 

সি এবং সি++ প্রোগ্রামিং এর শক্তিশালী বৈশিষ্ট্য হলো পয়েন্টার(Pointer) যার মাধ্যমে ইহা অন্যান্য জনপ্রিয় প্রোগ্রামিং ল্যাঙ্গুয়েজ যেমন- পাইথন এবং জাভা থেকে বেশী প্রাধান্য পায়।

মেমোরি এক্সেস(access) করার জন্য এবং মেমোরি এড্রেস নিপুণভাবে পরিচালনা করার জন্য সি প্রোগ্রামিং এ পয়েন্টার ব্যবহৃত হয়।


 

সি মেমোরি এড্রেস

 

পয়েন্টারের ধারণা নেওয়ার পূর্বে চলুন সি প্রোগ্রামিং এড্রেসের সাথে পরিচিত হয়ে নিই।

আপনার প্রোগ্রামে যদি count একটি ভ্যারিয়েবল থাকে তাহলে &count আপনাকে মেমোরির এড্রেস দিবে। এখানে & কে রেফারেন্স অপারেটর বলা হয়।

আপনি যখন scanf() ফাংশন ব্যবহার করবেন তখন অবশ্যই এই প্রতীকটি দেখবেন। ইউজার কর্তৃক ইনপুট ভ্যালু ভারিয়েবলের এড্রেসে জমা(store) করার জন্য ইহা ব্যবহৃত হয়।

scanf("%d",&count);

kt_satt_skill_example_id=470

নোটঃ এই একই কোড ব্যবহার করে আপনি এড্রেসের বিভিন্ন ভ্যালু পেতে পারেন।

উপরের সোর্স কোডে ভ্যালু 5 মেমোরির 2686778 লোকেশনে জমা হয়। count শুধুমাত্র সেই লোকেশন(location) এর নাম।

সি Pointer ভ্যারিয়েবল

সি প্রোগ্রামিং এ এক ধরণের বিশেষ ভ্যারিয়েবল রয়েছে যা অন্য ভ্যারিয়েবলের এড্রেস জমা(store) রাখে। ইহাকে পয়েন্টার ভ্যারিয়েবল বা শুধু পয়েন্টার বলা হয়।


 

Pointer ডিক্লেয়ারেশন

data_type* pointer_variable_name;
int* p;

উপরের স্টেটমেন্টে p কে int টাইপের পয়েন্টার ভ্যারিয়েবল হিসাবে ডিক্লেয়ার(declare) করা হয়েছে।


 

সি রেফারেন্স(&) এবং ডিরেফারেন্স(*) অপারেটর

ইতোপূর্বেই বর্ণনা করা হয়েছে যে, & কে রেফারেন্স(reference) অপারেটর বলা হয়। ইহার মাধ্যমে আপনি ভ্যারিয়েবলের এড্রেস পাবেন।

অনুরূপভাবে, অন্য একটি অপারেটর রয়েছে যার মাধ্যমে আপনি এড্রেস থেকে ভ্যালু পেতে পারেন। ইহাকে ডিরেফারেন্স(*) অপারেটর বলা হয়।

নিচের উদাহরণে পয়েন্টার, রেফারেন্স(reference) অপারেটর এবং ডিরেফারেন্স(dereference) অপারেটরের ব্যবহার স্পষ্টভাবে ব্যাখ্যা করা হয়েছে।

নোটঃ: পয়েন্টার ডিক্লেয়ারেশন(declaration) এ ব্যবহৃত * চিহ্ন ডিরেফারেন্স অপারেটর নয়। ইহা পয়েন্টার নির্দেশের জন্য শুধুমাত্র একটি প্রতীক।


 

উদাহরনঃ পয়েন্টারের ব্যবহার শেখার জন্য সি প্রোগ্রাম

kt_satt_skill_example_id=468


 

Working of pointers in C programming

 

উপরের প্রোগ্রাম এবং চিত্রের ব্যাখ্যা

 

  1. int* pc; পয়েন্টার ভ্যারিয়েবল pc তৈরি করে এবং int c; সাধারণ ভ্যারিয়েবল c তৈরি করে।
    যেহেতু pc এবং c উভয়কেই ইনিশিয়ালাইজ(initialized) করা হয়নি, সুতরাং পয়েন্টার pc এড্রেস বা র‍্যান্ডম(random) এড্রেস কোনো কিছুকেই নির্দেশ করে না। একইভাবে ভ্যারিয়েবল c এর এড্রেস এসাইন(assigned) করা হয়ছে কিন্তু ইহা random/garbage ভ্যালু ধারণ করে।
  2. c=22; ভ্যারিয়েবল c এ 22 এসাইন(assign) করে অর্থাৎ 22 ভ্যারিয়েবল c এর মেমোরি লোকেশনে জমা(store) করে।
    মনে রাখবেন, c(ভ্যারিয়েবল) এর এড্রেস(&c ) প্রিন্ট করার সময় আমরা %d এর পরিবর্তে %u ব্যবহার করবো যেহেতু এড্রেস সবসময় ধনাত্মক(unsigned integer) হয়।
  3. pc=&c; ভ্যারিয়েবল c এর এড্রেসকে পয়েন্টার pc তে এসাইন করে।
    যখন প্রিন্ট করা হয় তখন দেখবেন পয়েন্টার pc এর এড্রেস এবং c এর এড্রেস একই হবে। এছাড়া পয়েন্টার pc এর কন্টেটও একই(22) হবে।
  4. c=11; ভ্যারিয়েবল c এ 11 এসাইন করে।
    আমরা ভ্যারিয়েবল c এ নতুন ভ্যালু এসাইন করলাম যা পয়েন্টার pc কে প্রভাবিত করে।
  5. যেহেতু পয়েন্টার pc এবং c একই এড্রেসকে নির্দেশ করে, সুতরাং পয়েন্টার pc একই ভ্যালু 11 কেই রেফার করে।
    pc এর এড্রেস এবং কন্টেন্ট প্রিন্ট করলে আপডেট ভ্যালু 11 প্রদর্শিত হয়।
  6. *pc=2; পয়েন্টার pc দ্বারা নির্দেশিত মেমোরি লোকেশনের পূর্বের কন্টেন্ট পরিবর্তন করে 2 এসাইন করে।
    যেহেতু পয়েন্টার pc এবং ভ্যারিয়েবল c একই এড্রেসকে নির্দেশ করে সুতরাং c এর ভ্যালু পরিবর্তন হয়ে 2 হয়।

পয়েন্টার ব্যাবহারের সময় সাধারণ ভুলসমূহ

ধরুন, আপনি পয়েন্টার pc কে c এর এড্রেসে পয়েন্ট/নির্দেশ করতে চাচ্ছেন। তাহলে

int c, *pc;
pc=c;   /* ভুল! যেখানে pc হলো এড্রেস অথচ  c এড্রেস নয়। */
*pc=&c; /* ভুল! যেখানে *pc হলো এড্রেসের নির্দেশকৃত ভ্যালু অথচ &c  হলো এড্রেস। */
pc=&c;  /* Correct! যেহেতু pc এবং &c উভয়ই এড্রেস।  */
*pc=c;  /* সঠিক! যেহেতু *pc হলো এড্রেসের নির্দেশকৃত ভ্যালু  এবং c ও ভ্যালু। */

উভয় ক্ষেত্রেই পয়েন্টার pc, c এর এড্রেসকে নির্দেশ করে না।

common.content_added_by

সি পয়েন্টার অ্যারে (C pointer array)

298
298

এই অধ্যায়ে আপনি array এবং pointer এর সম্পর্ক সম্মন্ধে জানবেন এবং আপনি আপনার প্রোগ্রামে সঠিকভাবে এদেরকে ব্যবহার করা শিখবেন।


 

সি প্রোগ্রামিং পয়েন্টার এবং অ্যারে

 

সি প্রোগ্রমিং এ array এবং pointer প্রায় একই রকম। কিন্তু এদের মধ্যে গুরুত্বপূর্ণ পার্থক্য হলো পয়েন্টারের ভ্যালু হিসাবে বিভিন্ন এড্রেস থাকতে পারে পক্ষান্তরে array এর এড্রেস ফিক্সড(fixed) থাকে।

নিচের উদাহরণের সাহায্যে এদের মধ্যে পার্থক্য দেখানো হলোঃ

kt_satt_skill_example_id=476

নোটঃ আপনি array এর বিভিন্ন এড্রেস পেতে পারেন।

উপরের উদাহরণের ফলাফলে লক্ষ্য করলে দেখবেন যে, charArr অ্যারে এর পরস্পর দুটি এলিমেন্টের পার্থক্য সমান। অর্থাৎ এদের পার্থক্য হলো ১ বাইট।

কিন্তু পয়েন্টার যেহেতু অন্য ভ্যারিয়েবলের লোকেশনকে নির্দেশ করে, সুতরাং ইহা যেকোনো এড্রেস জমা(store) করতে পারে।

সি প্রোগ্রামিং Array এবং Pointer এর মধ্যে সম্পর্ক

নিচের ন্যায় একটি array বিবেচনা করুনঃ

int arr[4];

Relation between arrays and pointers


 

সি প্রোগ্রামিং এ array এর নাম সবসময় array এর প্রথম এলিমেন্টের এড্রেসকে নির্দেশ করে।

উপরের প্রোগ্রামে  arr এবং &arr[0]  উভয়ই প্রথম এলিমেন্টের এড্রেসকে নির্দেশ(point) করে।

&arr[0] সাধারণত  arr এর সমান

যেহেতু উভয়ের এড্রেস একই, সুতরাং arr এবং &arr[0] এর ভ্যালুও একই।

arr[0] সাধারণত  *arr(পয়েন্টারের এড্রেসের ভ্যালু) এর সমান। 

একইভাবে,

&arr[1] সাধারণত  (arr + 1) এর সমান এবং arr[1] সাধারণত  *(arr + 1) এর সমান। 
&arr[2] সাধারণত  (arr + 2) এর সমান  এবং arr[2] সাধারণত *(arr + 2) এর সমান। 
&arr[3] সাধারণত (arr + 1)এর সমান এবং arr[3] সাধারণত  *(arr + 3) এর সমান। 
.
.
&arr[i] সাধারণত  (arr + i) এর সমান  এবং arr[i] সাধারণত *(arr + i) এর সমান। 

সি প্রোগ্রামিং এ আপনি array ডিক্লেয়ার(declare) করতে পারেন এবং পয়েন্টার ব্যবহার করে এই array এর ডেটা(data) পরিবর্তন করতে পারেন।

উদাহরনঃ Array এবং Pointer ব্যবহার করে ৫ টি পূর্ণ সংখ্যার যোগফল নির্ণয়ের প্রোগ্রাম।

 

kt_satt_skill_example_id=478

 

common.content_added_and_updated_by

সি পয়েন্টার ফাংশন (C pointer function)

282
282

ই অধ্যায়ে আপনি পয়েন্টারকে ফাংশনের আর্গুমেন্ট(argument) হিসাবে অতিক্রম(pass) করানো শিখবেন। এছাড়া আপনার প্রোগ্রামে সঠিকভবে পয়েন্টার ব্যবহার করা শিখবেন।


 

পয়েন্টারঃ রেফারেন্স কর্তৃক ফাংশন কল করা

 

ফাংশন এর মধ্যে দিয়ে pointer কে যখন আর্গুমেন্ট হিসাবে অতিক্রম করানো হয় তখন ভ্যালুর পরিবর্তে মেমোরি লোকেশনের এড্রেস অতিক্রম হয়।

 

কারণ সি প্রোগ্রামিং এ পয়েন্টার ভ্যালু জমা রাখার পরিবর্তে মেমোরির লোকেশনকে ভ্যালু হিসাবে জমা(store) রাখে।

 

উদাহরনঃ পয়েন্টার এবং ফাংশনের ব্যবহার

রেফারেন্স(reference) দ্বারা ফাংশন কল করে দুটি সংখ্যাকে বিনিময়(swap) করার জন্য সি প্রোগ্রাম

 

kt_satt_skill_example_id=486

 

উপরের উদাহরণের ব্যাখ্যাঃ

  • num1 এবং num2 ভ্যারিয়েবলের মেমোরি লোকেশনের এড্রেসকে swap() ফাংশনের মধ্যে দিয়ে অতিক্রম করানো হয়। পয়েন্টার *n1 এবং *n2 ঐ এড্রেস-সমূহকে ভ্যালু হিসাবে গ্রহণ করে।
  • সুতরাং এখন পয়েন্টার n1 এবং n2 যথাক্রমে num1 এবং num2 এর এড্রেসকে নির্দেশ(point) করে।
  • পয়েন্টারের ভ্যালু যখন পরিবর্তন হয় তখন মেমোরি লোকেশনে নির্দেশিত(pointed) ভ্যালুও যথাক্রমে পরিবর্তন হয়।
  • সুতরাং পয়েন্টার *n1 এবং *n2 তে পরিবর্তন ঘটলে main() ফাংশনের num1 এবং num2 তেও পরিবর্তন ঘটে।

এই কৌশলকে সি প্রোগ্রামিং এ রেফারেন্স কর্তৃক(Call by Reference) কল করা বলা হয়।

common.content_added_and_updated_by

সি মেমোরি ম্যানেজমেন্ট (C memory management)

337
337

এই অধ্যায়ে আপনি স্টান্ডার্ড লাইব্রেরী ফাংশন malloc(), calloc(), free() এবং realloc() ব্যবহার করে আপনার প্রোগ্রামে ডাইনামিকভাবে মেমোরি বরাদ্দ(dynamically allocate memory) করা শিখবেন।


সি প্রোগ্রামিং এ, কম্পাইল টাইমে না যাওয়া পর্যন্ত array এর সাইজ অজানা থাকে। অর্থাৎ ঐ সময় পর্যন্ত যতক্ষণ না কম্পাইলার আপনার কোডকে কম্পিউটার বুঝে এমন কোডে এ(language ) রূপান্তর করে। সুতরাং মাঝে মাঝে array এর সাইজ(size) কম অথবা প্রয়োজনের তুলনায় বেশিও হতে পারে।

ডাইনামিক মেমোরি এ লোকেশন(Dynamic memory allocation) আপনার প্রোগ্রাম রান(run) করার সময় হয় অধিক মেমোরি ধরে রাখে অথবা প্রয়োজন না হলে ছেড়ে দেয়।

সহজ অর্থে, ডাইনামিক মেমোরি এলোকেশন আপনার প্রোগ্রামের মেমোরি স্পেস মায়লুয়ালি(manually) পরিচালনা করার সম্মতি দেয়।

সি প্রোগ্রামে উত্তরাধিকার সূত্রে মেমোরি বরাদ্দের জন্য ডাইনামিক কোনো কৌশল না থাকলেও হেডার ফাইল "stdlib.h" এর অধীনে ডাইনামিকভাবে মেমোরি এলোকেশন এর জন্য ৪টি লাইব্রেরী ফাংশন রয়েছে।

ফাংশনফাংশনের ব্যবহার
malloc()অনুরোধের ভিত্তিতে মেমোরি স্পেস বরাদ্দ করে এবং বরাদ্দ করা মেমোরির প্রথম বাইটের জন্য পয়েন্টার রিটার্ন করে।
calloc()Array এর এলিমেন্টের জন্য মেমোরি স্পেস বরাদ্দ করে এবং এর প্রাথমিক ভ্যালু 0(শূন্য) থাকে। তারপরে মেমোরিতে পয়েন্টার রিটার্ন করে।
free()পূর্বের বরাদ্দ করা মেমোরি স্পেস মুক্ত/খালি করে।
realloc()পূর্বের বরাদ্দ করা মেমোরি স্পেসের পরিবর্তন ঘটায়।

সি  malloc() ফাংশন

malloc এর পূর্ণরূপ "memory allocation"।

malloc() ফাংশন মেমোরির একটি নির্দিষ্ট জাইগা(bolck) দখল করে এবং void টাইপের pointer রিটার্ন করে যার মাধ্যমে যেকোনো আকৃতির(from) পয়েন্টার নিক্ষেপ(cast) হতে পারে।

 

malloc() এর সিনট্যাক্স

 

ptr = (cast-type*) malloc(byte-size)

এখানে ptr হলো নিক্ষেপ(cast) টাইপের পয়েন্টার। malloc() ফাংশন মেমোরির মধ্যে বাইট এককে নির্দিষ্ট সাইজের একটি পয়েন্টার রিটার্ন করে। মেমোরি স্পেস পর্যাপ্ত না হোলে NULL পয়েন্টার রিটার্ন(return) করে।

 

ptr = (int*) malloc(50 * sizeof(int));

এই স্টেটমেন্টটি int এর সাইজ(২ অথবা ৪ বাইট) এর উপর ভীতিকরে যথাক্রমে ১০০ অথবা ২০০ বাইট মেমোরি বরাদ্দ করতে পারে এবং পয়েন্টার মেমোরির প্রথম বাইটের এড্রেসে রেফার(point) করে।


সি  calloc() ফাংশন

calloc এর পূর্ণরুপ "contiguous allocation"।

 

malloc() এবং calloc() এর মধ্যে শুধুমাত্র পার্থক্য হলো malloc() ফাংশন মেমোরির সিঙ্গেল ব্লক(single block of memory) বরাদ্দ করে পক্ষান্তরে calloc() ফাংশন মেমোরির মাল্টিপল ব্লক(multiple blocks of memory) বরাদ্দ করে এবং প্রত্যেকের সাইজ সেট হয় 0(শূন্য)।

 

calloc() এর সিনট্যাক্স

 

ptr = (cast-type*)calloc(n, element-size);

এই স্টেটমেন্টটি n সংখ্যক এলিমেন্ট বিশিষ্ট array জন্য সন্নিহিত(contiguous) মেমোরি স্পেস বরাদ্দ করবে। 

উদাহরণস্বরূপঃ

ptr = (float*) calloc(50, sizeof(double));

এই স্টেটমেন্টটি ৫০টি এলিমেন্ট বিশিষ্ট array জন্য double(8 bytes) সাইজের সন্নিহিত(contiguous) মেমোরি স্পেস বরাদ্দ করবে।

 

সি  free() ফাংশন

 

calloc() অথবা malloc() ফাংশন কর্তৃক ডাইনামিকভাবে(Dynamically) বরাদ্দ হওয়া মেমোরি নিজে নিজে মুক্ত হতে পারে না। তাই আটককৃত(allocated) মেমোরি খালাস(release) করার জন্য আপনাকে অবশ্যই free() ফাংশন ব্যবহার করতে হবে।

 

free() সিনট্যাক্স

 

free(ptr);

এই স্টেটমেন্টটি পয়েন্টার(ptr) কর্তৃক মেমোরিতে বরাদ্দ হওয়া স্পেসকে খালি করে।

উদাহরনঃ সি malloc() এবং free() ফাংশনের ব্যবহার

ইউজার কর্তৃক ইনপুট নিয়ে n সংখ্যক এলিমেন্টের যোগফল নির্ণয়ের জন্য সি প্রোগ্রাম লিখুন।

এই প্রোগ্রামটি সম্পাদনের জন্য malloc() ফাংশন ব্যবহার করে ডাইনামিকভাবে মেমোরি বরাদ্দ(allocate) করতে হবে।

#include <stdio.h>
#include <stdlib.h>
int main()
{
   int num, i, *ptr, sum = 0;
   printf("Enter number of elements: ");
   scanf("%d", &num);
   ptr = (int*) malloc(num * sizeof(int));  //malloc ব্যবহার করে মেমোরি বরাদ্দ করা
   if(ptr == NULL)                     
   {
       printf("Error! memory not allocated.");
       exit(0);
   }
   printf("Enter elements of array: ");
   for(i = 0; i < num; ++i)
   {
       scanf("%d", ptr + i);
       sum += *(ptr + i);
   }
   printf("Sum = %d", sum);
   free(ptr);
   return 0;
}

উদাহরনঃ সি calloc() এবং free() ফাংশনের ব্যবহার

ইউজার কর্তৃক ইনপুট নিয়ে n সংখ্যক এলিমেন্টের যোগফল নির্ণয়ের জন্য সি প্রোগ্রাম লিখুন।

এই প্রোগ্রামটি সম্পাদনের জন্য calloc() ফাংশন ব্যবহার করে ডাইনামিকভাবে মেমোরি বরাদ্দ(allocate) করতে হবে।

#include <stdio.h>
#include <stdlib.h>
int main()
{
   int num, i, *ptr, sum = 0;
   printf("Enter number of elements: ");
   scanf("%d", &num);
   ptr = (int*) calloc(num, sizeof(int)); //calloc ব্যবহার করে মেমোরি বরাদ্দ করা
   if(ptr == NULL)
   {
       printf("Error! memory not allocated.");
       exit(0);
   }
   printf("Enter elements of array: ");
   for(i = 0; i < num; ++i)
   {
       scanf("%d", ptr + i);
       sum += *(ptr + i);
   }
   printf("Sum = %d", sum);
   free(ptr);
   return 0;
}

 

সি  realloc() ফাংশন

ইতিমধ্যে বরাদ্দকৃত মেমোরির সাইজ যদি প্রয়োজনের তুলনায় কম বা বেশি হয় তাহলে realloc() ফাংশন ব্যবহার করে আপনি পূর্ববর্তী মেমোরির সাইজ পরিবর্তন করতে পারেন।

realloc() এর সিনট্যাক্স

 

ptr = realloc(ptr, newsize);

এখানে ptr হলো নতুন সাইজের বরাদ্দ হওয়া মেমোরি।

 

উদাহরনঃ সি realloc() ফাংশনের ব্যবহার

#include <stdio.h>
#include <stdlib.h>
int main()
{
   int *ptr, i , n1, n2;
   printf("Enter size of array: ");
   scanf("%d", &n1);
   ptr = (int*) malloc(n1 * sizeof(int));
   printf("Address of previously allocated memory: ");
   for(i = 0; i < n1; ++i)
        printf("%u\t",ptr + i);
   printf("\nEnter new size of array: ");
   scanf("%d", &n2);
   ptr = realloc(ptr, n2);
   for(i = 0; i < n2; ++i)
        printf("%u\t", ptr + i);
   return 0;
}
common.content_added_and_updated_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion